#include "biblist.h"
#include <QDebug>

bibList::bibList()
{

}

/**
 * @brief 带参数构造函数，读取
 * @param s
 */
bibList::bibList(QString const & s) {
    readContent(s);
}

bibList::~bibList() {}

void bibList::readContent(const QString &s) {
    this->raw = s;
    int pos = 0;
    for(int i=0; i<countItems(); ++i) {
        list.append(bibItem(getAnItem(pos)));
    }
#ifdef PRINT_LIST_CONTENTS
    foreach(bibItem b, list) {
        qDebug() << b.content;
    }
#endif
}

/**
 * @brief 对bib文件中的条目进行计数
 * @return bib文件中的条目数
 */
int bibList::countItems() const {
    int pos = raw.indexOf('{') + 1;
    int left = 1;
    int cnt = 0;
    while(pos < raw.size()) {
        if(raw[pos] == '{') left++;
        else if(raw[pos] == '}') left--;
        pos++;
        if(left == 0) {
            cnt++;
            pos = raw.indexOf('{', pos) + 1;
            left = 1;
        }
    }
    return cnt;
}

/**
 * @brief 从bib文件中截取一个bib条目
 * @param from: 起始下j标
 * @return QString: bib条目
 */
QString bibList::getAnItem(int &from) const {
    int prev =  raw.indexOf('{', from);
    int pos = prev+1;
    int left = 1;
    while(left > 0) {
        if(raw[pos]=='{') {
            left++;
        }
        else if(raw[pos]=='}') {
            left--;
        }
        pos++;
    }
    from = pos;
    QString ret = raw.mid(prev, pos-prev);
    return ret;
}

/**
 * @brief 封装QVector<bibItem>，返回条目数
 * @return 当前图书馆的条目数
 */
size_t bibList::size() const {
    return list.size();
}

/**
 * @brief 封装QVector，获取第|index|个bib条目的|entry|信息
 * @param index
 * @param entry
 * @return 信息
 */
QString bibList::at(int index, QString const & entry) const {
    return list.at(index).content[entry];
}

/**
 * @brief 获取第|index|个bib条目
 * @param index
 * @return
 */
bibItem bibList::at(int index) const {
    return list[index];
}

/**
 * @brief 在当前图书馆追加一个bib条目
 * @param bib条目
 */
void bibList::append(QString const & s) {
    list.push_back(bibItem(s));
}

/**
 * @brief 将bib列表导出为.bib文件以备使用
 * @return 导出的bib文件内容
 */
QString bibList::toString() const {
    QString str;
    foreach(bibItem b, list) {
        str += b.toString();
    }
    return str;
}

/**
 * @brief 删除第|index|个引用条目
 * @param index
 */
void bibList::erase(int index) {
    list.erase(list.begin() + index);
}
